// pages/player/player.js
//不在页面中显示的话，不要定义再data中，因为需要列表中的数据放到数组中，并不需要显示再页面上，所以再外面设置
let musiclist = []
//正在播放歌曲的index
let nowPlayingIndex = 0

//调用全局方法
const app = getApp();

//获取全局唯一的背景音频管理器
const BackgroundAudioManager = wx.getBackgroundAudioManager()
Page({

  /**
   * 页面的初始数据
   */
  data: {
    picUrl:'',
    isPlaying:false,   //表示当前是否播放，一个状态值，根据这个状态值来进行改变播放或者暂停的一个状态，false为不播放，反之播放
    isLyricShow:false,  //表示当前歌词是否显示
    lyric:'', //给歌词初始化
    isSame:false,   //表示是否为同一首歌,false为不是同一首歌
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    // console.log(options)
    
    //options中有2个数据，要给是index下标，一个是对应的ID，上面设置了一个默认的初始播放歌曲的下标，那么把新的下标进行赋值
    nowPlayingIndex = options.index
    //获取之间缓存中存储的数据,要用同步的操作，获取出来数据才能进行下一步的操作
    musiclist = wx.getStorageSync('musiclist')
    //调用加载歌曲信息的方法
    this._loadMusicDetail(options.musicId);
  },

  //封面信息点击事件
  onChangeLyricShow(){
    this.setData({
      //再点击得时候进行取反
      isLyricShow:!this.data.isLyricShow
    })
  },

  //联动歌词事件
  timeUpdate(event){
    //选取当前组件selectComponent,注意update是一个方法，但是这个方法再调用的时候需要再lyric中进行声明使用
    this.selectComponent('.lyric').update(event.detail.currentTime)
  },


  //播放事件
  onPlay(){
    this.setData({
      isPlaying:true,
    })
  },
  //暂停事件
  onPause(){
    this.setData({
      isPlaying: false,
    })
  },

  //加载歌曲信息
  _loadMusicDetail(musicId){
    //判断当前播放的音乐id与传递过来选中的音乐id是否一致
    if (musicId == app.getPlayMusicId()) {
      this.setData({
        isSame:true
      })
    }else{
      this.setData({
        isSame:false
      })
    }
    //此处还应该判断一下，就是如果是同一首歌曲的话，那么正常播放，如果不是同一首歌曲，那么重新开始播放
    if (!this.data.isSame) {
      BackgroundAudioManager.stop()   //停止音乐播放，再上一首或者下一首的时候，停止之前播放的音乐
    }
    //通过获取到的下标取得其中的数据，之后赋值给一个新的变量
    let music = musiclist[nowPlayingIndex]
    // console.log(music)

    //这个一个api方法，改变上面顶部的名称
    wx.setNavigationBarTitle({
      title: music.name,
    })

    //调用全局的方法
    app.setPlayMusicId(musicId)

    this.setData({
      picUrl:music.al.picUrl,
      isPlaying:false   //刚加载进来，先进行不播放
    })


    //加载中给一些提示
    wx.showLoading({
      title: '歌曲加载中...',
    })
    //调用数据库中的数据
    wx.cloud.callFunction({
      name:'music',
      data:{
        musicId,
        $url:'musicUrl',
      }
    }).then((res)=>{
      // console.log(res)
      //res.result其中包含数据信息，而获取到的res是字符串，所以需要转化为对象格式
      let result = JSON.parse(res.result)

      //此处进行的判断，是考虑到后台接口有些音乐是vip才可以，如果不解决，那么result.data[0].url的时候会报错
      if (result.data[0].url == null) {
        wx.showLoading({
          title: '无权限播放',
        })
        return 
      }

      //此处一样要判断，如果当前不是同一首歌的话，那么重新进行获取
      if (!this.data.isSame) {
        //获取到result下data数据中0下标数据的url地址
        //此时要获取当前音乐的名称，否则会报错误信息,api特殊提供音频的显示信息
        BackgroundAudioManager.src = result.data[0].url,
        BackgroundAudioManager.title = music.name,
        BackgroundAudioManager.coverImgUrl = music.al.picUrl,  //封面地址
        BackgroundAudioManager.singer = music.ar[0].name,  //歌曲的歌手信息
        BackgroundAudioManager.epname = music.al.name   //专辑的名字

        //保存播放历史
        this.savePlayHistory()
      }
      //当数据都获取完毕，那么进行播放
      this.setData({
        isPlaying:true
      })
      //请求成功后，取消提示
      wx.hideLoading()


      //加载歌词（不能上来就加载歌词，歌曲再播放得时候再加载歌词）
      wx.cloud.callFunction({
        name:'music',
        data:{
          musicId,
          $url:'lyric',
        }
      }).then((res)=>{
        console.log(res)
        //设定暂无歌词是因为有些音乐是没有歌词得，比如纯音乐
        let lyric = '暂无歌词'
        const lrc = JSON.parse(res.result).lrc
        if (lrc) {
          lyric = lrc.lyric
        }
        this.setData({
          lyric
        })
      })
    })
  },

  //播放事件
  togglePlaying(){
    //判断当前是播放还是暂停，进行一个判断，如果是播放，那就进行暂停，如果是暂停就进行播放，其中音频api带了自带的方法
    if (this.data.isPlaying) {
      BackgroundAudioManager.pause()
    }else{
      BackgroundAudioManager.play()
    }
    //再更新数据的时候，记得取反，否则是无法变化的
    this.setData({
      isPlaying:!this.data.isPlaying
    })
  },

  //上一首
  onPrev(){
    //上一首肯定是--，但是不能一直--下去，如果当前是为0的话，那么下一首应该回到最后一首，也就是整体的长度，需要进行一个判断
    nowPlayingIndex--
    if (nowPlayingIndex < 0) {
      nowPlayingIndex = musiclist.length - 1
    }
    //这个时候需要调用加载歌曲信息的方法，但是需要有个ID的参数，那么参数再哪来?此时musiclist【nowPlayingIndex】是新的数据，把对应的ID传过去就好
    this._loadMusicDetail(musiclist[nowPlayingIndex].id)
  },
  //下一首
  onNext(){
    //道理与上一首一样，不能一直++，判断是否等于总体的长度，到最后的时候再赋值为0，也就是第一个
    nowPlayingIndex++
    if (nowPlayingIndex == musiclist.length) {
      nowPlayingIndex = 0
    }
    this._loadMusicDetail(musiclist[nowPlayingIndex].id)
  },

  //保存当前播放的历史
  savePlayHistory() {
    //获取当前正在播放的歌曲
    const music = musiclist[nowPlayingIndex]
    //获取全局中的openid,便于寻找
    const openid = app.globalData.openid
    //再本地存储中进行获取openid，看看存储中是否存在，如果不存在就添加，因为本地存储是一个数组，所以需要用到循环
    const history = wx.getStorageSync(openid)
    let bHave = false   //声明一个标识符，用来判断是否已经存储
    for (let i = 0, len = history.length; i < len; i++) {
      //如果本地存储中的数组id与当前播放音乐的id相同，那么标识符为true就是已经存在，直接结束掉即可
      if (history[i].id == music.id) {
        bHave = true
        break
      }
    }
    //如果bHave为false，那就是存储中没有，那么就进行存储
    if (!bHave) {
      //把正在播放的音乐添加到首位，之后返回新的数组长度
      history.push(music)
      //之后进行存储
      wx.setStorage({
        key: openid,
        data: history,
      })
    }
  },
  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {

  }
})